Passed
Push — main ( 8f901a...3322df )
by Andrii
02:33
created

map.ts ➔ mapping   A

Complexity

Conditions 2

Size

Total Lines 19
Code Lines 16

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 2
eloc 16
dl 0
loc 19
rs 9.6
c 0
b 0
f 0
1
import {
2
  CssModule,
3
} from "./defs";
4
import type {
5
  ClassNamesMapping, ClassNamesMap,
6
} from "./index.types";
7
import {resolver} from "./core"
8
import { AnyObject } from "./ts-swiss";
9
10
const {keys: $keys} = Object
11
12
export default classNamesMap
13
export {
14
  classNamesMap
15
}
16
17
/**
18
 * Set up mapping classnames function
19
 * @example
20
 * ```typescript
21
 * const mapping = classNamesMap(classnames)
22
 * ```
23
 */
24
function classNamesMap<
25
  Source extends CssModule,
26
>(classnames: Source){
27
  const mapper: ClassNamesMapping<Source> = map => mapping(classnames, map)
28
  return mapper
29
}
30
31
function mapping<
32
  Source extends CssModule,
33
  Target extends AnyObject = CssModule,
34
  Map extends ClassNamesMap<Target, Source> = ClassNamesMap<Target, Source>
35
>(
36
  source: Source,
37
  map: Map
38
): {[T in keyof Map]: string} {
39
  const keys = $keys(map) as (keyof Map)[]
40
  , classnames = {} as {[T in keyof Map]: string}
41
42
  for (let i = keys.length; i--;) {
43
    const key = keys[i]
44
    
45
    classnames[key] = resolver(source, map[key]!).join(" ")
46
  }
47
48
  return classnames
49
}
50
51